import {
  Column,
  CreateDateColumn,
  Entity,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
} from 'typeorm';
import { ApiHideProperty, ApiProperty } from '@nestjs/swagger';
import { Exclude, Expose, Transform } from 'class-transformer';

// 实体会映射成数据库中的表
@Entity()
export class User {
  @PrimaryGeneratedColumn() // 主键，自增
  @ApiProperty({ description: '用户ID', example: 1 })
  id: number;

  @Column({ length: 50, unique: true })
  @ApiProperty({ description: '用户名', example: 'nick' })
  username: string;

  @Column()
  @Exclude() // 将目标属性从序列化输出中排除，使其不被包含在最终的序列化结果中，即不会被返回到客户端
  @ApiHideProperty() // 表示这是一个隐藏字段不会出现在swagger文档中
  password: string;

  @Column({ length: 100, nullable: true })
  @ApiProperty({ description: '邮箱', example: '123456@qq.com' })
  email: string;

  @Column({ length: 15, nullable: true })
  @Transform(({ value }: any) =>
    value ? value.replace(/^(\d{3})(\d{4})(\d{4})$/, '$1****$3') : value,
  ) // 提供自定义的转换逻辑，可以在序列化或反序列化过程中对属性进行转换。
  @ApiProperty({ description: '手机号', example: '15200000000' })
  phone: string;

  @Column({ default: 1 }) // 是否生效 1 生效 0 失效
  @ApiProperty({ description: '生效状态', example: 1 })
  status: number;

  @Column({ default: false }) // 是否是超级管理员
  @ApiProperty({ description: '是否是超级管理员', example: true })
  is_super: boolean;

  @Column({ default: 100 }) // 排序编号
  @ApiProperty({ description: '排序编号', example: 100 })
  sort: number;

  // @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
  @CreateDateColumn()
  @ApiProperty({ description: '创建时间', example: '2025年3月20日00:04:54' })
  createdAt: Date;

  // @Column({
  //   type: 'timestamp',
  //   default: () => 'CURRENT_TIMESTAMP',
  //   onUpdate: 'CURRENT_TIMESTAMP',
  // })
  @UpdateDateColumn() // 直接使用这个装饰器，会自动更新时间
  @ApiProperty({ description: '更新时间', example: '2025年3月20日00:04:54' })
  updatedAt: Date;

  @Expose() // 向外暴露一个属性
  @ApiProperty({ description: '联系方式', example: 'zs@qq.com' })
  get contact(): string {
    return `邮箱为：${this.email}`;
  }
}
